﻿//
//#include <iostream>
//using namespace std;
//
////继承的语法:
//// class 子类类名 :[继承方式] 父类类名
////public private protected
//
//// 继承中的构造和析构函数
////		子类对象在创建的时候，需要先调用父类中的构造函数，来初始化从父类继承到的部分。默认调用的是父类中的无参构造函数。
////		子类对象在销毁的时候，先调用自己的析构函数，再调用父类的析构函数。
//
//
//// Q：如果父类中没有无参构造函数，或者父类中的无参构造函数是私有的，会不会对子类(仅仅存在无参构造)产生影响？
//// A：会！因为子类对象在创建的时候，需要默认先调用父类中的无参构造函数。
//// Q：如何解决这个问题：
//// A：
////		1. 给父类添加无参构造，或者修改访问权限
////		2. 在子类的构造函数中，显式调用父类中存在的构造函数
////子类调用父类构造，属性是怎么去实现赋值????
//
//
//// 父类和子类中出现了同名字的成员（函数、属性）
////		子类会将从父类继承到的成员隐藏起来，子类对象直接访问，访问的是子类中的成员。
////		如果想要访问父类中继承下来的成员，需要显式指定。
//
//class Animal {
//public:
//	int age;
//
//	 Animal() : age(0) {
//	 	cout << "Animal类中的无参构造函数被执行了" << endl;
//	 }
//
//	Animal(int _age) : age(_age) {
//		cout << "Animal类" <<_age << endl;
//		cout << "Animal类"<< age << endl;
//		cout << "Animal类中的有参构造函数被执行了" << endl;
//	}
//
//
//	void showage() {
//		cout << "父类中的showage函数被调用了，age = " << age << endl;
//	}
//
//	~Animal() {
//		cout << "Animal类中的析构函数执行了" << endl;
//	}
//};
//
//class Dog : public Animal {
//public:
//	Dog() : Animal() {
//		cout << "Dog类的无参构造函数执行了" << endl;
//	}
//	Dog(int age) : Animal(age) {
//		cout << "Dog类的youcan构造函数执行了" << endl;
//		cout << "Dog类的youcan"<< age << endl;
//
//	}
//
//	void showAge() {
//		cout << "子类中的showAge函数被调用了，age = " << age << endl;
//	}
//	~Dog() {
//		cout << "Dog类中的析构函数执行了" << endl;
//	}
//};
//
//void test()
//{
//	//Animal a;
//	//Dog d(22);
//}
//
//void test2()
//{
//	 //创建一个子类对象
//	Dog dog(66);
//	//dog.age = 22;
//	dog.showAge();
//
//	// 访问从父类继承到的成员（被隐藏起来的）
//	dog.Animal::showage();
//
//	cout << endl;
//	Animal a;
//	a.showage();
//}
////int main()
////{
////	test2();
////    std::cout << "Hello World!\n";
////	return 0;
////}
//
